首页 > 试题广场 >

字符串加密

[编程题]字符串加密
  • 热度指数:140403 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
有一种技巧可以对数据进行加密,它使用一个单词作为它的密匙。下面是它的工作原理:首先,选择一个单词作为密匙,如TRAILBLAZERS。如果单词中包含有重复的字母,只保留第1个,将所得结果作为新字母表开头,并将新建立的字母表中未出现的字母按照正常字母表顺序加入新字母表。如下所示:

A B C D E F G H I J K L M N O P Q R S T U V W X Y Z

T R A I L B Z E S C D F G H J K M N O P Q U V W X Y (实际需建立小写字母的字母表,此字母表仅为方便演示)

上面其他用字母表中剩余的字母填充完整。在对信息进行加密时,信息中的每个字母被固定于顶上那行,并用下面那行的对应字母一一取代原文的字母(字母字符的大小写状态应该保留)。因此,使用这个密匙, Attack AT DAWN (黎明时攻击)就会被加密为Tpptad TP ITVH。

请实现下述接口,通过指定的密匙和明文得到密文。

数据范围: ,保证输入的字符串中仅包含小写字母


输入描述:

先输入key和要加密的字符串



输出描述:

返回加密后的字符串

示例1

输入

nihao
ni

输出

le
secretKey = input()#密钥
word = input()#需要加密的内容
set1 = []#本来想用集合去重,发现去重后会打乱排列顺序,只能用列表去循环判断去重了
alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
for i in secretKey.upper(): #去重
    if i not in set1:
        set1.append(i)
        # print('去重后输出:',set1)

alphabet = list(alphabet)
list1 = alphabet.copy()#转换为列表后复制一个新的,用作处理得到译文的尾缀

for j in set1:
    list1.remove(j)
# print('加密的译文尾缀',list1)

list2 = list(set1) + list1 #去重的密钥加上尾缀形成加密用的译文
# print('译文',list2)

#加密过程,区分大小写和空格字符处理,最后join串联成字符串输出
encrypWord = []
for k in word:
    if k.isalpha() and k.isupper():
        # print('密文大写字母',k)
        encrypWord.append(list2[alphabet.index(k)])
    elif k.isalpha and k.islower():
        # print('密文小写字母',k)
        encrypWord.append(list2[alphabet.index(k.upper())].lower())
    else:
        # print('密文其他字符',k)
        encrypWord.append(list2[alphabet.index(k)])
    # print(encrypWord)
print("".join(encrypWord))


发表于 2023-03-27 14:52:12 回复(0)
s1,alpb,alpN,s2 = '','abcdefghijklmnopqrstuvwxyz','',''
for i in input():
    if i not in s1:
        s1 += i
for i in alpb:
    if i not in s1:
        alpN += i
oringin = input()
for i in oringin:
    for j in range(len(alpb)):
        if i == alpb[j]:
            s2 += (s1+ alpN)[j]
print(s2)
#申请了好多个字符串,但感觉这样直观一点就是

发表于 2022-09-01 12:09:55 回复(0)
很多人题目都没懂,我也是看了几分钟才看懂,大概解释下:
首先我们有个原始的字母表即:
['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z']
其次,根据我们输入的秘钥单词,生成一个新的秘钥,规则就是
1)先将秘钥单词去重后,按原有的顺序保留下来,如输入的 aaddcc,则保留adc即可,顺序不能变
2)然后再对照原始字母表,看还有哪些字母没用上,直接添加到后面,如我们已经保留了adc,则剩余的befghijklmnopqrstuvwxyz,直接添加到adc后面,最终我们的新秘钥就是:
adcbefghijklmnopqrstuvwxyz,想必大家应该都懂了
最后,就是生成加密字符串的规则了,便于理解,先将原始字母表和新秘钥放在一起对比:
原始:abcdefghijklmnopqrstuvwxyz
秘钥:adcbefghijklmnopqrstuvwxyz
加密的规则就是,要加密的单词,如我们输入的是abcd,找到每个字母在原始字母表中的位置,然后对应在新秘钥中的位置的字母,就是加密后的字母,如a在原始字母中是第一位,则它在新秘钥中的第一位,就是它的加密值,例子中也是a;b在原始中是第二位,则新秘钥中第二位的d就是它的加密值,以此类推,abcd加密后的值就是adcb

while True:
    try:
        n = input().lower() # 秘钥单词
        word = input().lower() # 需要加密的字符串
        keys = sorted(set(n),key=n.index) # 将输入的秘钥单词去重,并且不打乱原有的顺序
        list1 = ['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'] # 原始字母表
        keyList = [] # 用来保存生成的新的秘钥
        keyStr = [] # 用来保存加密后的字符
        for i in keys:
            keyList.append(i) # 生成新的秘钥,第一步是先将去重后的单词秘钥保存
        for i in list1:
            if i not in keyList: # 继续生成新的秘钥,第二步就是将正常字母表中未用到的字母,加到新的秘钥中去,这样就生成了完整的秘钥
                keyList.append(i)
        for i in word:
            s = list1.index(i) # 先确定我们要加密的单词,每个字母在正常字母表中的排序位置
            keyStr.append(keyList[s]) # 然后再根据这个字母在正常字母表中的位置,找到它在新的秘钥中同样位置对应的字母,这个字母即加密就的字母
        print(''.join(keyStr)) # 将最终的加密后的字符拼接起来,即得到加密后的字符串
    except:
        break
发表于 2022-08-16 21:36:17 回复(0)
n=input()
m=input()
list1=['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z']
res=''
a=1
for i in n[::-1]:
    list1.remove(i)
    list1.insert(0,i)
for i in m:
    a=ord(i)-97
    res+=list1[a]
print(res)
    

发表于 2022-08-11 20:04:17 回复(0)
key=input()
s=input()
lkey=[]
es=''
le=    ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z']
for i in key:
    if i not in lkey:
        lkey.append(i)

for i in le:
    if i not in lkey:
        lkey.append(i)
for i in s:
    es+=lkey[le.index(i)]
print(es)    
发表于 2022-08-09 11:21:29 回复(0)
‘’‘
这题不难,但是需要理清思路。
1. 明确密钥只能包含重复字母中的第一个。因此遍历密钥,将其中第一个字母记录下来,形成uniq_key列表
2. 使用uniq_key作为新字母表的开头,并使用其它未出现的字母填充。因为需要考虑大小写,
所以生成两个新字母表full_list_az和full_list_AZ,前者存放uniq_key和小写字母,后者存放uniq_key和大写字母
3. 构建大小写字母对应的查找表。大写字母表[A, Z]对应full_list_AZ,小写字母表[a, z]对应full_list_az
4. 遍历明文,并将每个字母依次按照查找表转换。
’’‘
import copy
while True:
    try:
        # 得到密钥和铭文
        secrect_key = input()
        plain = input()
        
        uniq_key = []
        for k in secrect_key:
            if k not in uniq_key:
                # 得到没有重复的密钥
                uniq_key.append(k)
        full_list_az = [chr(x) for x in range(ord('a'), ord('z')+1)]
        full_list_AZ = [chr(x) for x in range(ord('A'), ord('Z')+1)]
        
        uniq_key_az = copy.deepcopy(uniq_key)
        for kaz in full_list_az:
            if kaz.lower() not in uniq_key_az and kaz.capitalize() not in uniq_key_az:
                uniq_key_az.append(kaz)
        uniq_key_AZ = copy.deepcopy(uniq_key)
        for kAZ in full_list_AZ:
            if kAZ.lower() not in uniq_key_AZ and kAZ.capitalize() not in uniq_key_AZ:
                uniq_key_AZ.append(kAZ)
        
        assert len(uniq_key_az) == len(full_list_az) and len(uniq_key_AZ) == len(full_list_AZ)
        
        look_up_dict = {}
        for kaz, uniq_kaz, kAZ, uniq_kAZ in zip(full_list_az, uniq_key_az, full_list_AZ, uniq_key_AZ):
            look_up_dict[kaz] = uniq_kaz
            look_up_dict[kAZ] = uniq_kAZ
        
        res = ''
        for k in plain:
            if k.isalpha():
                res += look_up_dict[k]
            else:
                res += k
        print(res)
        
    except:
        break

发表于 2022-07-27 14:36:39 回复(0)
python3 两个字典
while True:
    try:
        temp_key, key = input(), ""
        for letter in temp_key:
            if letter not in key:
                key += letter
        
        temp_mapp, mapp = "abcdefghijklmnopqrstuvwxyz", ""
        for letter in temp_mapp:
            if letter not in key:
                mapp += letter
        mapp = sorted(mapp)
        mapp = "".join(mapp)
        key = key + mapp
        
        origin_map, key_map = {}, {}
        for i in range(26):
            origin_map[temp_mapp[i]] = i
            key_map[i] = key[i]
        
        code, output = input(), ""
        for letter in code:
            letter = origin_map[letter]
            letter = key_map[letter]
            output += letter
        print(output)
    except:
        break


发表于 2022-07-16 10:33:37 回复(0)
key = input()
str1 = input()
list1 = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z']
list2 = []
for i in key:
    if i not in list2:
        list2.append(i)
for i in list1:
    if (i not in list2) and (i.lower() not in list2):
        list2.append(i)
for i in str1:
    if 'a'<= i <= 'z':
        index = list1.index(i.upper())
        print(list2[index].lower(),end='')
    elif 'A'<= i <= 'Z':
        index = list1.index(i)
        print(list2[index].upper(),end='')
    else:
        print(i,end='')

发表于 2022-07-02 14:55:27 回复(0)
alpha_lst = [chr(ord('a')+ i) for i in range(26)]
key = input()
strs = input()
key_list = []
for i in key:
    if i not in key_list:
        key_list.append(i)
    else:
        continue
alpha_lst_ = alpha_lst[:]
for i in key_list:
    if i in alpha_lst:
        alpha_lst.remove(i)
alpha_lst_encode = key_list+alpha_lst

res = ''
dic = dict(zip(alpha_lst_, alpha_lst_encode))
# print(dic)
for i in strs:
    res= res+dic[i]
print(res)

发表于 2022-06-16 21:36:41 回复(0)
        key = input()
        need_en = input()
        word = ''.join([chr(v) for v in range(ord('A'), ord('Z') + 1)])
        st = ''
        out_de = ''
        for i in key:
            if i not in st:
                st += i
        for j in word:
            if j.lower() not in st and j.upper() not in st:
                st += j
        for j in need_en:
            if j.isupper():
                inx = word.find(j)
                out_de += st[inx]
            elif j.islower():
                inx = word.find(j.upper())
                out_de += st[inx].lower()
            else:
                out_de += j

        print(out_de)
发表于 2022-06-13 15:05:38 回复(0)
key = input()

s = list(key) + [chr(ord('a') + i) for i in range(26)]
key_list = []
for item in s:
    if str(item).lower() not in key_list:
        key_list.append(str(item).lower())
upperKey = ''.join(key_list).upper()
lowerKey = ''.join(key_list).lower()

enkey_str = input()
for item in enkey_str:
    index = ord(str(item).upper()) - ord('A')
    if str(item).isupper():
        print(upperKey[index:index + 1], end='')
    else:
        print(lowerKey[index:index + 1], end='')

发表于 2022-06-09 13:12:35 回复(0)
while True:
    try:
        kk = input()
        ss = input()
        lst = ['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z']
        lst1 = lst.copy()
        kk_1 = ""
        for i in kk:
            if i not in kk_1:
                kk_1 += i 
        for i in kk_1:
            if i in lst:
                lst.remove(i)
        lst2 = list(kk_1)+lst
        ss_1 =""
        for i in ss:
            if i in lst1:
                ss_1 += lst2[lst1.index(i)]
            else:
                ss_1 += i
        print(ss_1)
    except:
        break
发表于 2022-06-07 23:51:45 回复(0)
while True:
    try:
        low = "abcdefghijklmnopqrstuvwxyz"
        secret = ""
        result = ""
        key = input()
        word = input()
        for i in key: 
            if i not in secret:
                secret += i
        for letter in low: # 构建密钥表
            if letter not in secret:
                secret += letter
        for j in word:
            index = low.index(j)
            result += secret[index]
        print(result)
        
    except:
        break
发表于 2022-06-07 13:47:39 回复(0)
while True:
    try:
        ss = [x.lower() for x in 'A B C D E F G H I J K L M N O P Q R S T U V W X Y Z'.split(' ')]
        s1, s2 = input(), input()
        s_1 = []
        for s in s1:
            if s not in s_1:
                s_1.append( s )
        s1 = ''.join(s_1) + ''.join([x for x in ss if x not in s_1])
        ssr = ''
        for s22 in s2:
            ssr += s1[ss.index( s22 )]
        print(ssr)
    except:
        break

发表于 2022-06-01 16:21:14 回复(0)
while True:
    try:
        k = input()
        s = input()
        ke = ""
        for i in k:         #单词字符串去重
            if i not in ke:
                ke = ke + i
        lib = "abcdefghijklmnopqrstuvwxyz" 
        key = ""     
        for i in lib:   #生成单词字符串之外的字母
            if i not in ke:
                key = key + i
        key = ke + key    #组合成密钥
        for i in s:
            print(key[ord(i) - 97],end="")     #按字母ASIIC数字大小,定位输出
    except:
        break
#就这样咯
发表于 2022-05-24 16:06:51 回复(0)
import string

a = input().lower()  # 接受密钥
b = list(input())  # 接受明文
a1 = []
for i in a:
    if i not in a1:
        a1.append(i)  # 密钥查重
c = list(string.ascii_lowercase)  # 获得字母表
c1 = []
for j in c:
    if j not in a1:
        c1.append(j)  # 获得修改后的字母表
c2 = a1 + c1  # 将修改后的字母表加入到密钥后来获取新字母表
d = []
for k in b:
    if k in c:
        d.append(c.index(k))  # 获得明文在新字母表中的位置
d1 = []
for m in d:
    m = int(m)
    d1.append(c2[m])  # 用该位置在新字母表中获得字符串
d1 = "".join(d1)
print(d1)  # 输出该字符串

发表于 2022-05-20 00:45:08 回复(0)
while True:
    try:
        k = input()   ####key输入
        jm = input()  ####解密输入
        k_qc = ''
        ls = [chr(i) for i in range(97,123)]    #获取小写列表a~z
        for i in k:
            if i not in k_qc:
                k_qc += i     ###将key去重
        pj = k_qc+''.join(ls) ###将key和az列表拼接
        res = ''
        rel = ''
        for i in pj:
            if i not in res:
                res += i ####将拼接后的列表去重即可得到密码表
        for i in jm:
            rel += res[ls.index(i)]
        print(rel)
    except:
        break
        
    

    

        

发表于 2022-05-19 22:37:48 回复(0)